libobs_wrapper\display\window_manager/
show_hide.rs1use std::sync::atomic::Ordering;
2
3use windows::Win32::UI::WindowsAndMessaging::{ShowWindow, SW_HIDE, SW_SHOWNA};
4
5use crate::display::ObsDisplayRef;
6
7#[cfg_attr(not(feature = "blocking"), async_trait::async_trait)]
8pub trait ShowHideTrait {
9 #[cfg_attr(feature = "blocking", remove_async_await::remove_async_await)]
10 async fn show(&mut self);
11 #[cfg_attr(feature = "blocking", remove_async_await::remove_async_await)]
12 async fn hide(&mut self);
13 #[cfg_attr(feature = "blocking", remove_async_await::remove_async_await)]
14 async fn is_visible(&self) -> bool;
15}
16
17#[cfg_attr(not(feature = "blocking"), async_trait::async_trait)]
18impl ShowHideTrait for ObsDisplayRef {
19 #[cfg_attr(feature = "blocking", remove_async_await::remove_async_await)]
20 async fn show(&mut self) {
21 log::trace!("show");
22 let m = self.manager.read().await;
23 unsafe {
24 let _ = ShowWindow(m.hwnd.0, SW_SHOWNA);
25 }
26
27 m.is_hidden.store(false, Ordering::Relaxed);
28 }
29
30 #[cfg_attr(feature = "blocking", remove_async_await::remove_async_await)]
31 async fn hide(&mut self) {
32 log::trace!("hide");
33 let m = self.manager.read().await;
34 unsafe {
35 let _ = ShowWindow(m.hwnd.0, SW_HIDE);
36 }
37
38 m.is_hidden.store(true, Ordering::Relaxed);
39 }
40
41 #[cfg_attr(feature = "blocking", remove_async_await::remove_async_await)]
42 async fn is_visible(&self) -> bool {
43 self.manager.read().await.is_hidden.load(Ordering::Relaxed)
44 }
45}